// Convierte los archivos .txt de wikipedia en varios separados por temas.

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include "./TADs/lista.h"

#define origen "./textosWikiOriginales/"
#define destino "./textosWikiParseados/"

bool esArchivoValido(char* fileName)
{
	if (fileName[ strlen(fileName) -1] == '~') return false;
	return true;
}

lista_t* conseguirNombresArchivos(void)
{
	lista_t* filesNames = lista_crear();
		
	DIR *dir;
    struct dirent *dent;
    dir = opendir(origen);
    char* fileDir;
    
    if(dir != NULL)
    {
        while( (dent=readdir(dir)) != NULL )
        {
			if (strlen(dent->d_name) > 4 && esArchivoValido(dent->d_name))
			{
				fileDir = malloc(sizeof(char)*(strlen(origen) + strlen(dent->d_name))+ sizeof(char));
				strcpy(fileDir, origen);
				strcat(fileDir, dent->d_name);
				lista_insertar_ultimo(filesNames, fileDir);
			}
		}
    }
    
    closedir(dir);
    
    return filesNames;
}

void parsearArchivos(lista_t* nombresArchivos)
{
	lista_iter_t* iter = lista_iter_crear(nombresArchivos);
	FILE * archivoParseado = NULL;
	FILE * archivoParsear = NULL;
	char nombreArchivoParseado[200];
	int posicionNombreArchivoParseado = 0;
	
	while (lista_iter_al_final(iter) == false)
	{
		char* nombreArchivoParsear = lista_iter_ver_actual(iter);
		archivoParsear = fopen(nombreArchivoParsear, "r");
		
		char ch = fgetc ( archivoParsear );
		
		while(ch != EOF)
		{
			if (ch == '[')
			{
				ch = fgetc ( archivoParsear );
				if (ch == EOF) break;
				// Si hay doble corchete empieza otro articulo.
				if (ch == '[')
				{
					// Junto todo el nombre del proximo articulo
					ch = fgetc ( archivoParsear );
					while (ch != ']')
					{
						// Saltea estos caracteres si aparecen.
						if (ch == '/')
						{
							ch = fgetc ( archivoParsear );
							continue;
						}
						nombreArchivoParseado[posicionNombreArchivoParseado] = ch;
						posicionNombreArchivoParseado++;
						ch = fgetc ( archivoParsear );
						if (posicionNombreArchivoParseado > 150) printf("%c", ch);
					}
					ch = fgetc ( archivoParsear ); // Saltea el otro corchete
					ch = fgetc ( archivoParsear ); // Y se posiciona en el primer caracter util
					
					nombreArchivoParseado[posicionNombreArchivoParseado] = '\0';
					posicionNombreArchivoParseado = 0;
					if ( nombreArchivoParseado[ strlen(nombreArchivoParseado) - 1] == '|' )
						continue;	// No es un nuevo articulo
					
					// Creo el path completo con dicho orden
					char* pathDestinoCompleto = malloc(sizeof(char)*256);
					strcpy(pathDestinoCompleto, destino);
					strcat(pathDestinoCompleto, nombreArchivoParseado);
					strcat(pathDestinoCompleto, ".txt");
					printf("%s\n", pathDestinoCompleto);
					
					// Cierro el archivo viejo
					if (archivoParseado != NULL) fclose(archivoParseado);
					
					// Creo el archivo nuevo
					archivoParseado = fopen(pathDestinoCompleto, "w");
					free(pathDestinoCompleto);
					
				} else {
					fprintf(archivoParseado, "[%c", ch);
					continue;
				}
			} 
			if (archivoParseado == NULL) printf("CAGADA\n");
			fprintf(archivoParseado, "%c", ch);
			
			ch = fgetc ( archivoParsear );
		}
		
		lista_iter_avanzar(iter);
		
		fclose(archivoParsear);
		fclose(archivoParseado);
		archivoParseado = NULL;
		printf("***************** \nARCHIVO TERMINADO \n*****************\n");
	}
	
}

int main(void)
{
	lista_t* nombresArchivosOrigen = conseguirNombresArchivos();
	parsearArchivos(nombresArchivosOrigen);
	
	return 0;
}
